package com.mylater.nace.common;

/**
 * The ByteUtils represents Bytes 数组处理工具
 *
 * @author fengjiachun
 * @version $Id$
 */
public class ByteUtils {

    /**
     * 截取16进制的数组中的内容[start开始，截取长度为length]转化为10进制
     *
     * @param bytes
     * @param start
     * @param length
     * @return
     */
    public static int bytes2Int(byte[] bytes, int start, int length) {
        int sum = 0;
        int end = start + length;
        for (int i = start; i < end; i++) {
            int n = bytes[i] & 0xff;
            n <<= (--length) * 8; // 相当于乘以2的8次方，bytes中是16进制数组，要转为10进制
            sum += n;
        }
        return sum;
    }

    /**
     * 10进制转16进制
     *
     * @param value
     * @param length
     * @return
     */
    public static byte[] int2Bytes(int value, int length) {
        byte[] bytes = new byte[length];
        for (int i = 0; i < length; i++) {
            bytes[length - i - 1] = (byte) ((value >> 8 * i) & 0xff);
        }
        return bytes;
    }

    /**
     * byte数组转化为String，这个String类已经提供了
     *
     * @param bytes
     * @param start
     * @param length
     * @return
     */
    public static String bytes2String(byte[] bytes, int start, int length) {
        return new String(bytes, start, length);
    }

    public static byte[] string2Bytes(String str) {
        return str.getBytes();
    }

    /**
     * @param originalBytes 最初的字节数组
     * @param offset        要替换内容的开始位置
     * @param length        要替换掉的内容的长度
     * @param replaceBytes  替换的内容的字节数组
     * @return
     */
    public static byte[] bytesReplace(byte[] originalBytes, int offset, int length, byte[] replaceBytes) {
        // 分配新数组
        // 长度为：最初字节数组的长度 + 新内容数组的长度 - 要替换的原始内容数组的长度
        byte[] newBytes = new byte[originalBytes.length + (replaceBytes.length - length)];
        /**
         * 这段逻辑不好解释，我们用一个例子来说明：
         * 假设我们要将最初的字节数组中的“abc”替换成“defghi”
         */
        // 将原字节数组中“abc”前面的全部内容拷贝到新数组中
        System.arraycopy(originalBytes, 0, newBytes, 0, offset);
        // 将替换内容“defghi”全部拷贝到新数组中，“defghi”的起始位置就是原来“abc”的我起始位置
        System.arraycopy(replaceBytes, 0, newBytes, offset, replaceBytes.length);
        // 将原字节数组中“abc”后面的全部内容拷贝到新数组中，这部分内容紧跟在“defghi”的后面
        System.arraycopy(originalBytes, offset + length, newBytes, offset + replaceBytes.length, originalBytes.length - offset - length);

        return newBytes;
    }
}
